﻿using AdmLaboratorios.DAO;
using AdmLaboratorios.DTO;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Data;

namespace AdmLaboratorios.Business
{
    public static class OrdenesProduccion
    {
        static OrdenProduccionDAO daoOP = DAOFactory.Get<OrdenProduccionDAO>();
        static OrdenProduccionItemDAO daoItem = DAOFactory.Get<OrdenProduccionItemDAO>();


        public static List<OrdenProduccionDTO> GetOpByPartner(PartnerDTO partner)
        {
            string where = string.Format("IdPartner = {0} and Activo = 1", partner.Id);

            return daoOP.ReadAll(where);
        }


        public static OP Guardar(OP op)
        {
            List<OrdenProduccionItemDTO> aux = new List<OrdenProduccionItemDTO>();

            try
            {
                using (SqlTransaction tran = daoOP.IniciarTransaccion())
                {
                    var cabecera = daoOP.Create(op.OrdenProduccion, tran);

                    foreach (OrdenProduccionItemDTO item in op.Items)
                    {
                        OrdenProduccionItemDTO itemAux = new OrdenProduccionItemDTO();

                        item.Activo = true;

                        item.IdOrdenProduccion = cabecera.Id;

                        itemAux = daoItem.Create(item, tran);

                        daoItem.Log(LogDTO.eAcciones.Alta, "Alta de Item de la OP nro: " + cabecera.Id, itemAux.Id, tran);

                        aux.Add(itemAux);
                    }

                    daoOP.Log(LogDTO.eAcciones.Alta, "Alta de OP", cabecera.Id, tran);

                    daoOP.CommitTransaccion(tran);

                    op.OrdenProduccion = cabecera;
                    op.Items = aux;

                    return op;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            
        }

        public static OP Modificar(OP op)
        {
            List<OrdenProduccionItemDTO> aux = new List<OrdenProduccionItemDTO>();

            try
            {
                using (SqlTransaction tran = daoOP.IniciarTransaccion())
                {
                    var cabecera = op.OrdenProduccion;
                    daoOP.Update(cabecera, cabecera.Id, tran);
                    daoOP.Log(LogDTO.eAcciones.Modificacion, "Modificacion de OP", cabecera.Id, tran);

                    daoItem.Delete("IdOrdenProduccion=" + cabecera.Id.ToString(), tran);
                    daoItem.Log(LogDTO.eAcciones.Baja, "Baja de Items de la OP nro: " + cabecera.Id, 0, tran);

                    foreach (OrdenProduccionItemDTO item in op.Items)
                    {
                        OrdenProduccionItemDTO itemAux = new OrdenProduccionItemDTO();

                        item.Activo = true;
                        item.IdOrdenProduccion = cabecera.Id;
                        itemAux = daoItem.Create(item, tran);
                        
                        daoItem.Log(LogDTO.eAcciones.Alta, "Alta de Item de la OP nro: " + cabecera.Id, itemAux.Id, tran);
                        aux.Add(itemAux);
                    }

                    daoOP.CommitTransaccion(tran);
                    op.Items = aux;

                    return op;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public static List<OrdenProduccionDTO> GetOrdenesProduccion()
        {
            return daoOP.ReadAll();
        }

        public static List<OrdenProduccionDTO> GetOrdenesProduccion(string filtro)
        {
            return daoOP.ReadAll(string.Format("NumeroOP LIKE '%{0}%' OR NumeroLote LIKE '%{0}%'", filtro));
        }

        public static DataTable Consulta(string filtro, string estado)
        {
            if (filtro.Trim() != string.Empty)
                return daoOP.Consulta(string.Format("(A.NumeroOP LIKE '%{0}%' OR A.NumeroLote LIKE '%{0}%' OR B.Nombre LIKE '%{0}%' OR C.Nombre LIKE '%{0}%' OR C.NombreComercial LIKE '%{0}%') AND Estado = '{1}'",
                    filtro, estado.ToString()));
            else
                return daoOP.Consulta(string.Format("Estado = '{0}'", estado.ToString()));
        }

        public static DataTable Consulta(string filtro, string estado, PartnerDTO partner)
        {
            if (filtro.Trim() != string.Empty)
                return daoOP.Consulta(string.Format("(A.NumeroOP LIKE '%{0}%' OR A.NumeroLote LIKE '%{0}%' OR B.Nombre LIKE '%{0}%' OR C.Nombre LIKE '%{0}%' OR C.NombreComercial LIKE '%{0}%') AND Estado = '{1}' AND IdPartner = {2}", 
                    filtro, estado.ToString(), partner.Id));
            else
                return daoOP.Consulta(string.Format("Estado = '{0}' AND IdPartner = {1}", estado.ToString(), partner.Id));
        }

        public static List<OrdenProduccionItemDTO> GetItems(int ordenId)
        {
            return daoItem.ReadAll("IdOrdenProduccion=" + ordenId.ToString());
        }

        public static OrdenProduccionDTO GetOp(int id)
        {
            return daoOP.Read(id);
        }



        public static OP Clonar(int idOpOriginal)
        {
            List<OrdenProduccionItemDTO> aux = new List<OrdenProduccionItemDTO>();

            try
            {
                using (SqlTransaction tran = daoOP.IniciarTransaccion())
                {
                    var cabecera = GetOp(idOpOriginal);
                    var items = GetItems(idOpOriginal);

                    cabecera.Id = 0;
                    cabecera.Estado = eOrdenProduccionEstado.ACTIVA.ToString();
                    cabecera.Activo = true;
                    cabecera.Fecha = DateTime.Today;

                    cabecera = daoOP.Create(cabecera, tran);

                    foreach (OrdenProduccionItemDTO item in items)
                    {
                        OrdenProduccionItemDTO itemAux = new OrdenProduccionItemDTO();

                        item.Id = 0;
                        item.Activo = true;
                        item.IdOrdenProduccion = cabecera.Id;
                        item.IdStock = null;

                        itemAux = daoItem.Create(item, tran);

                        daoItem.Log(LogDTO.eAcciones.Alta, "Alta de Item de la OP nro: " + cabecera.Id, itemAux.Id, tran);

                        aux.Add(itemAux);
                    }

                    daoOP.Log(LogDTO.eAcciones.Alta, "Alta de OP", cabecera.Id, tran);

                    daoOP.CommitTransaccion(tran);

                    OP op = new OP();
                    op.OrdenProduccion = cabecera;
                    op.Items = aux;

                    return op;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        public static bool Eliminar(int id)
        {
            try
            {
                using (SqlTransaction tran = daoOP.IniciarTransaccion())
                {
                    daoItem.Delete("IdOrdenProduccion=" + id.ToString(), tran);
                    daoOP.Delete(id, tran);
                    daoOP.Log(LogDTO.eAcciones.Alta, "Eliminacion de OP", id, tran);

                    daoOP.CommitTransaccion(tran);
                    
                    return true;
                }
            }
            catch (Exception)
            {
                return false;
            }
        }
    }
}
